package ebj.common.JDBC.conn_pool.custom;

import com.alibaba.fastjson.JSONObject;



/**
 * <p>功能说明: 这个实现 需要改进：参考Druid，改进设计，做一个超轻量级的数据库连接池
 * 小结 ：
          1.连接池诞生原因是，如果每次都从数据库获得连接，时间比较长，因此我们提前做建立一些连接，放在连接池里面，每次都从里面取
          2.上面仅仅写了连接池基本原理，关于多线程下连接池的管理没写，后面对多线程操作熟练了添加吧</p>
 * @author zhoushineyoung@hotmail.com
 * @time 2016年10月20日 下午12:01:36
 */
public class Client {
	public static void main(String[] args) throws InterruptedException {
		// 初始化连接池
		Thread t = init();
		t.start();
		t.join();
		
		ThreadConnection a = new ThreadConnection();
		ThreadConnection b = new ThreadConnection();
		ThreadConnection c = new ThreadConnection();
		Thread t1 = new Thread(a);
		Thread t2 = new Thread(b);
		Thread t3 = new Thread(c);
		
		
		// 设置优先级，先让初始化执行，模拟 线程池 先启动
		// 这里仅仅表面控制了，因为即使t 线程先启动，也不能保证pool 初始化完成，为了简单模拟，这里先这样写了
		t1.setPriority(10);
		t2.setPriority(10);
		t3.setPriority(10);
		t1.start();
		t2.start();
		t3.start();
		
		System.out.println("线程A-> "+ a.getConnection());
		System.out.println("线程B-> "+ b.getConnection());
		System.out.println("线程C-> "+ c.getConnection());
	}

	// 初始化
	public static Thread init() {
		Thread t = new Thread(new Runnable() {
			@Override
			public void run() {
				IPool  pool = initPool();
				while(pool == null || !pool.isActive()){
					pool = initPool();
				}
			}
		});
		return t;
	}
	
	public static IPool initPool(){
		return IPoolManager.getInstance().getPool("testPool");
	}

}
